package de.mnit.basis.swt.dialog;

import de.mnit.basis.daten.WandleObjekt;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Programm;
import de.mnit.basis.sys.Ausgabe;

/**
 * @author Michael Nitsche
 *
 * TODO Hier muß noch das Log berücksichtigt werden!
 * TODO Sollte evtl. in einen SyncThread gepackt werden, somit auch jederzeit von externen Threads aufrufbar
 * TODO Evtl. die Trennung zum beenden durch Fehler/Hinweis realisieren
 * TODO Wenn Fehler auftreten, wo noch keine Shell angezeigt wird, wird auch kein Dialog geöffnet!
 * TODO Warum null zurückgeben? Dann doch besser void, oder?
 */
public class SWT_Fehler {

	public static RuntimeException zeig(Throwable t, boolean ende) {
		return zeig(t, null, ende);
	}

	public static RuntimeException zeig(Throwable t, String text, boolean ende) {
		Fehler.objekt.wenn_Null(t);
		String fehlertext="";

		if(text!=null)
			fehlertext+=text+"\n\n";

//		Throwable tt=t;
//		while(tt.getCause()!=null)
//			tt=tt.getCause();
//		fehlertext= tt.toString();

		if(t!=null)
			fehlertext+=t.getMessage()+"\n\n";

		if(t instanceof F_Programm) {
			F_Programm bf=(F_Programm)t;
			for(Object o : bf.gAnhang())
				fehlertext+=WandleObjekt.zuTextDebug(o)+"\n\n";
		}

		if(ende)
			fehlertext=fehlertext+"Die Anwendung wird beendet!";

		Ausgabe.fehler(t);
		SWT_Meldung meldung= new SWT_Meldung(fehlertext).sTyp_Fehler();
		meldung.oeffnen(ende); //Bei Absturz muß gewartet werden, damit der Dialog auch angezeigt wird!!!
		if(ende)
			System.exit(1);
		return null;
	}

	public static RuntimeException neu(String fehlertext, boolean ende) {
		try {
			throw F_Programm.neu(fehlertext);
		}
		catch(F_Programm f) {
			return zeig(f, ende);
		}
	}

}
